技巧40 开发工具容器
作为一名工程师,如果你发现自己常常苦恼的问题是,在其他机器上没有自己雪花般美丽独特的个人开发环境里的程序或配置,那么本技巧也许正好适用。类似地,如果想和其他人分享自己精心定制的开发环境,Docker可以让这件事情变得更简单。
问题
想在其他人的机器上访问自己定制的开发环境。
解决方案
用自己的配置创建一个容器,然后把它放到一个镜像注册中心里。
作为演示,这里将使用一个我们的开发工具镜像。读者可以通过执行 docker pull dockerinpractice/docker-dev-tools-image
来下载它。如果想查看Dockerfile,可以在https://github.com/docker-in-practice/docker-dev-tools-image查阅。
运行该容器非常简单——直接执行 docker run -t -i dockerinpractice/docker-dev-tools-image
就能给用户一个开发环境的shell。这里读者可以使用我们的dotfiles,也可以就配置方面给我们一些建议。
本技巧和其他技巧配合起来更能体现其威力。在代码清单5-7里,读者可以看到一个开发工具容器,用来在宿主机网络和IPC栈上展示一个用户图形界面(GUI),然后挂载宿主机上的代码。
代码清单5-7 运行带有用户图形界面的开发工具镜像
docker run -t -i \
-v /var/run/docker.sock:/var/run/docker.sock \ ⇽--- 挂载Docker套接字以访问宿主机上的Docker守护进程
-v /tmp/.X11-unix:/tmp/.X11-unix \ ⇽--- 挂载X服务器Unix域套接字可以启动一个基于用户图形界面的应用(见技巧29)
-e DISPLAY=$DISPLAY \ ⇽--- 设置构建容器时的环境变量以使用宿主机的显示器
--net=host --ipc=host \ ⇽--- 这些参数绕过容器的网桥并且通过这些参数可以访问宿主机上的进程间通信文件(见技巧109)
-v /opt/workspace:/home/dockerinpractice \ ⇽--- 挂载工作区到该容器的home目录
dockerinpractice/docker-dev-tools-image
上述命令提供了一个环境,它能够访问宿主机的下列资源:
- 网络;
- Docker守护进程(执行普通Docker命令,就像在宿主机上一样);
- 进程间通信(IPC)文件;
- 如果需要,用X服务器启动一些基于用户图形界面的应用。
注意
挂载宿主机目录时,常常要小心不要挂载任何重要的目录,因为可能会破坏文件。通常最好避免挂载宿主机上的任何根目录。
讨论
我们前面提到过可以访问X服务器,因此技巧29也许值得一看,它会给你提供一些可能性。
对于某些更具侵入性的开发工具,也许是用于检查宿主机上的进程之类的,这时候用户可能需要看看技巧109,了解一下如何授予Docker容器查看系统的某些(默认)受限制的部分。技巧93也是一份很重要的参考资料——因为一个容器能够看到系统部分的视图并不一定意味着它有权限修改它们。